// 定义命令模式相关的 trait 和结构体

// 命令 trait，定义了命令的执行方法
trait Command {
    fn execute(&self);
}

// 接收者 Receiver
struct Receiver;

impl Receiver {
    // 接收者的具体操作
    fn action(&self) {
        println!("Receiver: Executing action");
    }
}

// 具体命令 ConcreteCommand
struct ConcreteCommand {
    receiver: Receiver, // 持有一个接收者的实例
}

impl ConcreteCommand {
    // 创建新的 ConcreteCommand 实例
    fn new(receiver: Receiver) -> Self {
        Self { receiver }
    }
}

// 实现 Command trait for ConcreteCommand
impl Command for ConcreteCommand {
    // 实现命令的执行方法，调用接收者的具体操作
    fn execute(&self) {
        self.receiver.action();
    }
}

// 调用者 Invoker
struct Invoker {
    command: Option<Box<dyn Command>>, // 持有一个命令的可选实例
}

impl Invoker {
    // 创建新的 Invoker 实例
    fn new() -> Self {
        Self { command: None }
    }

    // 设置命令
    fn set_command(&mut self, command: Box<dyn Command>) {
        self.command = Some(command);
    }

    // 执行命令
    fn execute_command(&self) {
        if let Some(ref command) = self.command {
            command.execute();
        }
    }
}

// 主函数入口
pub fn main() {
    let receiver = Receiver; // 创建接收者实例
    let command = ConcreteCommand::new(receiver); // 创建具体命令实例
    let mut invoker = Invoker::new(); // 创建调用者实例

    invoker.set_command(Box::new(command)); // 设置命令
    invoker.execute_command(); // 执行命令
}
